package com.gradumate.client.gui;

import java.util.logging.Logger;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.RootPanel;
import com.gradumate.client.Element;
import com.gradumate.client.GraduMate;
import com.gradumate.client.service.GraduMateService;
import com.gradumate.client.service.GraduMateServiceAsync;
import com.gradumate.shared.Gebruiker;

/**
 * Klasse die word gebruikt zodat leden van de afstudeercommissie en de
 * studieadviseur hun e-mail email instellingen kunnen aangeven.
 * 
 * @author Hugo Zonderland
 * 
 */
public class GebruikerInstelling {

	// Asyncserver
	private GraduMateServiceAsync server = GWT.create(GraduMateService.class);

	// Tables waar data op terrecht komt
	private FlexTable flxTable;
	int row;

	// Logger
	private final Logger log = Logger.getLogger(GebruikerInstelling.class.getName());
	
	// Elementen
	private Element element = new Element();
	private CheckBox chkbxMailOntvangen;
	private Button btnSubmit;

	/**
	 * Constructor
	 * @param Gebruiker huidige gebruiker
	 */
	public GebruikerInstelling() {
		// Loading-gif plaatsen.
		GraduMate.setLoadingImage(true);
		GraduMate.clearStatusMessages();
		
		// Gebruiker ophalen uit cache
		Gebruiker gebruiker = GraduMate.getGebruiker();
		
		// Controleren of de Gebruiker van het juiste type is.
		if (gebruiker.getType() != 0 && (gebruiker.getType() == Gebruiker.TYPE_AFSTUDEERCOMMISIE_VOORZITTER || gebruiker.getType() == Gebruiker.TYPE_AFSTUDEERCOMMISSIE_LID || gebruiker.getType() == Gebruiker.TYPE_STUDIE_ADVISEUR)) {
			createForm(gebruiker);
		} else {
			GraduMate.addErrorMsg("Deze pagina is alleen toegankelijk voor leden van de afstudeercommissie en studieadviseurs.");
		}
	}
	
	/**
	 * Maakt het formulier aan
	 * @param Gebruiker gebruiker
	 */
	private void createForm(final Gebruiker gebruiker) {
		// Flextable opnieuw aanmaken
		FlexTable hTable = new FlexTable();
		hTable.setStyleName("datatableNoBorder");

		// Header op het panel plaatsen.
		hTable.setWidget(0, 0, element.getHeaderLabel("Gebruiker instelling"));
		
		// Table aanmaken
		flxTable = new FlexTable();
		flxTable.setStyleName("datatable");
		flxTable.setCellSpacing(0);
		flxTable.setCellPadding(0);
		row = 0;
		
		// CheckBox voor email
		flxTable.setWidget(row, 0, element.getH2Label("Vink af wat van toepassing is."));
		row++;
		
		chkbxMailOntvangen = new CheckBox();
		chkbxMailOntvangen.setValue(gebruiker.isMailOntvangen());
		flxTable.setWidget(row, 0, element.getLabel("E-mail ontvangen?"));
		flxTable.setWidget(row, 1, chkbxMailOntvangen);
		row++;
		
		// Button
		btnSubmit = element.getOpslaanButton();
		btnSubmit.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent e) {
				setButtonLoadingImage(true);
				
				// Mailontvangen waarde omzetten naar de Gebruiker en dan opslaan
				boolean mailOntvangen = chkbxMailOntvangen.getValue();
				gebruiker.setMailOntvangen(mailOntvangen);
				
				// Opslaan in DS
				server.updateGebruiker(gebruiker, new AsyncCallback<Boolean>() {
					public void onFailure(Throwable caught) {
						setButtonLoadingImage(false);
						log.info("updateGebruiker(" + gebruiker + ") | AsyncCallback " + caught.getMessage());
						GraduMate.addAsyncError();
					}

					@Override
					public void onSuccess(Boolean result) {
						setButtonLoadingImage(false);
						GraduMate.addSuccessMsg("De instellingen zijn opgeslagen!");
					}	
				});
			}
		});
		
		// Button table
		FlexTable flxButton = new FlexTable();
		flxButton.setStyleName("datatableNoBorder");
		flxButton.setCellSpacing(0);
		flxButton.setCellPadding(0);
		flxButton.setWidget(0, 0, btnSubmit);
		
		// Laadimage uit
		GraduMate.setLoadingImage(false);
		
		// Rootpanel schoonvegen en tabellen erop zetten
		RootPanel.get("main").clear();
		RootPanel.get("main").add(hTable);
		RootPanel.get("main").add(flxTable);
		RootPanel.get("main").add(flxButton);
	}
	
	/**
	 * Plaatje op de Save button plaatsen, leuke feature.
	 * @param show
	 */
	private void setButtonLoadingImage(boolean show) {
		if (show) {
			btnSubmit.setHTML("Laden.. " + element.getImage("Laden..", "ajax-loader.gif").toString());
		} else {
			btnSubmit.setHTML("Opslaan " + element.getImage("Opslaan", "disk.png").toString());
		}
	}
}
